-Готовые" -Документация,"
-Фотографии," -Линки," -Истории,"

АГАТ: Эмулятор, утилиты, исходники, агатовский софт [ Разные замечания по эмулятору, вместо документации ]

Предисловие

IBM-PC-шная часть

ISO 9660

Технические заметки

Агатовская часть

dos33c2

ToDo

Все эти замечания относятся к эмуляторам выпуска 2004 года. С тех пор было выпущено ещё несколько версий, одна из которых Alpha - есть на странице с игрушками - это несколько переконфигурированная девятка, другая (пока не опубликованная) - развитие основной ветки. Развитие, в основном, только в сторону отлова мелких ошибок, а также не очень существенных дополнений (вроде вынесенного в отдельный файл знакогенератора).

Дисплей:
  - В семерке эмулируются все режимы семерки.
  - В девятке эмулируются все режимы девятки, которые висят на C7xx.
  - Apple-mode не эмулируются, но приводят к остановке VM.
  - Регистры управления палитрой девятки влияют только на режим 256x256x4.
  - Text64x32 всегда выводится пользовательским образом, может быть
    изменен клавишей f11 и не зависит от программного переключателя.
  - Мерцание в тексте идет в парилку и несет флаг.
  - Знакогенератор девятки вроде правильный (хотя с документацией не
    совпадает, зато совпадает с программами).
  - Расширение знакогенератора семёрки (ниже 128-го символа) придумывал сам,
    поэтому совпадает только с моими программами.
  - Для работы достаточно VGA, поэтому не конфликтует с VESA-WINDOWS-BIOS
    и прочим.
  - Поддерживается бит яркости.

Флоп 140к:
  - Подключен на $C3xx и $C0Bx.
  - Имя файла-образа первого привода по умолчанию "test140.img", второго -
    "test140_.img". Но в процессе работы можно выбирать другие имена.
  - ROM у семерки и девятки отличается ! Это связано, вероятно,
    с развитием PnP BIOS.
  - Вращение диска происходит только при обращении к портам ввода/вывода
    дисковода.
  - Флаг ReadOnly на файле-образе передается как сигнал write protect
    в виртуальный дисковод.
  - Поскольку модель дисковода не очень точно соответствует реальному
    устройству, может не всегда работать форматирование образа.
    Но несколько форматтеров я проверил... Работают :)

Флоп 800к:
  - Подключен на $C5xx и $C0Dx.
  - Работает и запись и чтение, но не форматирование (т.е. не предусмотрена
    возможность перезаписи поля адреса). Эмуляция этого дисковода сделана
    менее точно, чем 140к, но в основной массе операционок работает.
  - Имя файла-образа первого привода "test800.img", второго - "test800_.img",
    но в процессе работы можно выбирать другие имена.
  - Вообще говоря, все работает как положено и без сложностей,
    за исключением того, что сигнал сбоя синхронизации жестко привязан
    к определенным позициям на треке, а не хранится в nibble-файле
    диска.
  - Вращение происходит при обращении к портам ввода/вывода (на байт),
    при чтении состояния (на ~ два бита) и при выполнении любых других команд
    виртуальной машиной (порядка нескольких сотен команд на байт, и
    только при включенном шпинделе).
  - Флаг ReadOnly на файле-образе передается как сигнал write protect
    в виртуальный дисковод.
   Эмулятор при выключенном Num Lock эмулирует num pad Агата
   через num pad AT следующим образом:

                  /--------------------\
                  |  ф1  |  ф2  |  ф3  | - агатовская кнопка
                  |  7   |  8   |  9   | - ибмовская кнопка
                  | Home |  ^   | PgUp |
                  |--------------------|
		  |  ф4  |  ф5  |  ф6  |
		  |  4   |  5   |  6   |
		  |  <   |      |  >   |
                  |--------------------|-----\
                  |  ф7  |  ф8  |  ф9  |     |
		  |  1   |  2   |  3   |  E  |
                  | End  |  V   | PgDn |  n  |
                  |--------------------|  t  |
                  |  ф0  |  ф.  |  ф=     e  |
                  |  Ins |  Del |         r  |

                   ====================

                  |  ф0  |  ф.  |  ф=  | - Это та клавиатура, что над стрелками
                  |Insert| Home |PageUp|
                  |--------------------|
                  |  F1  |  F2  |  F3  |
                  |Delete| End  |PageDn|
                  \--------------------/

   Управление виртуальной машиной:

F1 - help (справка по кнопкам)
F2 - reset (Упр-Сбр)
F3 - раскладка клавиатуры (qwerty/jcuken)

Смена имени образа:
Shift-F3 - s3d1 140к
Shift-F4 - s3d2 140к
Shift-F5 - s5d1 800к
Shift-F6 - s5d2 800к

F5 - монитор виртуальной машины
F6 - сброс состояния (не реализовано)
F7 - чтение состояния (не реализовано)
F8 - sound on/off
F9 - power (щелчок питанием:
     7: $3f3,4 <- const, mem cfg <- 0, reset
     9: $3f3,4 <- const, c085 <- const, reset
     )
F10 - exit (выход из эмулятора)
F11 - смена цветового режима text64x32
F12 - вкл/выкл пультов. Некоторые проги (lode runner, например)
      неадекватно реагируют на наличие пультов, поэтому по умолчанию
      они выключены.

Scrool lock - этот программный переключатель действует аналогично
              агатовскому РУС-РЕГ.


Кто не помнит: клавише РЕД соответствует ESC ;)

Вот клавиши ПВТ к огромному сожалению на ATшной клавиатуре нету :((
Ждать 0.25 секунды до автоповтора иногда долго. Да, IMHO, и 30 знаков
в секунду - это тоже мало. Я свою агатовскую клаву разгонял знаков до 40-50).





Оба эмулятора понимают в качестве дисков специальные
nibble - файлы. Фактически, это последовательности
байт, которые читаются/пишутся непосредственно в порт
дисковода при работе RWTS.

140:
  - Формат используется в некоторых эмуляторах Apple][,
    откуда и взят мной без изменений. Проблемм с ним не обнаружено.
  - Прога для конверсии обычного образа в nibble
    называется nibble14 и может гонять как образ в nibble,
    так и назад. Но она не умеет создавать nibble, поэтому
    ей для прямой конверсии нужен любой nibble с правильными
    полями адреса и безразличным содержимым полей данных.
    Для конверсии просто укажите в командной строке
    имя исходного файла и файла назначения. По размеру исходного
    будет определено направление конверсии.

800:
  - Формат предложен мной. Проблемм пока с ним не было обнаружено,
    но еще не вечер.
  - Прога для конверсии обычного образа в nibble называется
    nibble80 и может гонять пока только обычный образ
    в nibble. При этом nibble-болванка не требуется.
    В командной строке указывается имеющийся образ
    и желаемое имя nibble. Третий необязательный параметр -
    номер тома, который будет записываться в поля адреса nibble.
    By default это 254, но, например, Sprite OS требует другие
    номера.
  - Некоторые проги также требуют всяких нестандартностей,
    как то: совпадение номера тома с номером сектора, окончание
    данных на $5a $fe вместо просто $a5 и иные извращения
    (это, типа, защита от копирования. Я многие уже раскусил,
    но пока не все - см. images\*.*).
    Собственно на этот случай прикладываю исходник nibble80.pas


Пульты:
  - Эмулируются через мышь. Но не совсем точно, поэтому движения могут
    быть слишком резкими.
  - Игрушка lode runner прикидывается зависшей, если ее запустить при
    включенных пультах. Вероятно, это ее собственная проблемма.


Загрузка:
  - По умолчанию семерка порывается грузится с 800к, а девятка - со 140к.
    Если не нравится - быстро нажмите f2 [если не успели - f9 и сразу f2],
    а затем вручную: C300G или C500G.


Баги:
  - Эмулятор девятки изредка может подвиснуть. Причина пока не выяснена.
  - В работе семерки ошибок не обнаружено.
  - В работе девятки, вероятно, есть какие-то глюки, связанные с откликом
    устройств. Но выловить пока не могу. См также images\, особенно
    с ключевыми строками "!!!+++be94" - это оттуда.
    Конкретно эту ошибку удается нейтрализовать, если после процедуры
    анализа аппаратуры исправить ее результат в памяти VM, но это не
    есть rules.
  - Собственно, в настоящий момент мне известно три проявления
    глюкавости эмулятора девятки,
    которые повторяются на разных дисках и прогах из разных источников.
    Условно я пока называю их так:
    "!!!+++be94" - глюк в определении аппаратуры в kermit95, например.
    "СЧМ9" - передача управления на незадействованные адреса. Пока подробно
    не разбирался с ней.
    "РАПИРА" - странное управление памятью - когда не надо переключать
    банк памяти, рапира его переключает и имеет fault. Если переключение
    обойти (sta ) - все работает.
  - Вроде нашел причину завесок эмулятора девятки. Вероятно, это результат
    выполнения фрагмета вроде sta c700,x\inx\jmp start. При этом эмулятор
    начинает постоянно обращаться к vga-bios, что приводит к растяжению
    виртуального времени и, как следствие, отсутствиям реакции на внешнее
    раздражение. В связи с этим введен анализ клавиши Alt - при ее
    удержании эмулятор перестает отрабатывать длительные опрерации с
    физический аппаратурой, а также выполняет все команды без задержки.
    Этим удобно пользоваться, чтобы быстро прокрутить какую нибудь заставку
    игры, например.
  - При работе Рапиры, которая была для семерки и шла вместе с ней еще
    в, кажется, 1988 году, вылетает недопустимый опкод. Но если его пропустить,
    все работает. Я предполагаю, что это ошибка в рапире, которая на реальном
    железе просто обрабатывается как недокументированная команда (у 6502
    море недокументированных команд - у меня есть их описания. Эмулятор
    их не выполняет, т.к. в реальном софте я их практически не встречал).

Прочее:
  - По сообщению Олега Воронова в реальной девятке отклик несуществующих
    устройств неопределен. В то же время могу заверить, что в семерке
    он был очень даже определен благодаря наличию 1к резюков, притягивающих
    ШД к единицам, если какое либо устройство не тянуло бит к нулю. Однако
    в эмуляторе девятки случайностей не предусмотрено... Хотя, в общем,
    можно это сделать, если надо.
    В общем, в результате, в эмуляторе семерки неиспользуемые адреса
    в районе cXYY отзываются $FF, а в девятке: $CX.
  - Прерывания от таймера есть, но они привязаны к виртуальному, а не
    реальному времени - определенное количество прерываний на определенное
    количество выполненных команд.

Благодарности:
  - Сергей Морев: за присланную документацию на девятку
  - Олег Воронов и Игорь Бончан: за образы дисков и консультации
  - Стажер: за кривой, но все таки набранный эмулятор 6502
  - Голов, Цикоза, Бадер,....: за исходные данные для железа и эмуляторов
    [У вас точно ничего больше не осталось ? ;)))]
  - И многих других за многое прочее ;)


Системное ПЗУ Агат7 немного исправлено: по resetу при проверке $3f3-4
не выполняется передача управления на [$3f2], а только вываливается
в system monitor. Ни на одной проге это пока не отразилось.

Исправление было сделано еще на натуральном железе,
а потом попало в файлы эмулятора.



Виртуальная машина, помимо основных регистров, содержит также следующие:

dr0 - точка остановки. При PC=dr0 программа снимается с выполнения и
      запускается монитор ВМ.

dr1 - замедлялка. Значение 1 - максимальная скорость эмуляции, значение
      $ffff - микрокалькулятор Б3-34 идет на обгон.
      Для celeron366 рекомендуется dr1=$170
      By default - максимальная скорость.

Попытка записать что нибудь по адресам c0fx или c050-c057 воспринимается
в девятке как ошибка и приводит к остановке вирутальной машины.

Естесно, что все фишки совместимости с Apple][ не эмулируются. Возьмите
любой эмулятор Apple][ и играйтеся - среди них есть очень хорошие.

Если вам кажется, что VM висит - нажмите F1. Правильно работающий
эмулятор независимо от проделок программы, исполняющейся в VM, нарисует
встроенный help по клавишам. Если не помогло - нажмите и удерживайте
alt.

В монитора виртуальной машины действуют следующие кнопки [регистр важен !]:
s - выполнить одну команду ВМ
g - GO !!!
j - установить dr0 на следующую за текущей команду, после чего GO !!!
    (это для прохождения подпрограмм, например)
b - установка dr0 - break point
a - установка dr1 - скорость эмуляции
v - установка начального адреса дампа виртуальной памяти из 8 байт, который
    выводится под регистрами зеленым цветом
e - изменение байта, на который указывает 'v'
Q - выход из эмулятора
r - reset (PC=word[$fffc])
R - щелчок питанием
u,d - сдвиг монитора по экрану (не надо задвигать его за границы экрана
    - получите General Protect Fault)
m - записать некоторое значение по заданному адресу. Используется
    для воздействия во время отладки на программные переключатели ($Cxxx)
h - справка по доступным кнопкам
W - сброс всей памяти на диск в файл dump.bin. Работает только в девятке
F - забивание всей памяти константой 'pots'. Работает только в девятке
p - вывод последних 16-и значений PC - работает в мониторе виртуальной машины.
    Используется для поиска пути, по которому забрел виртуальный проц
    в очередной глюк.

Владимир
deka sobaka itc точка tsu точка ru
deka пёсик ssmu точка ru

Зеркало сайта